﻿using SkiaAndModel.NodeAbstract;
using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SkiaAndModel.Models
{
    public class VisualNode
    {
        public INode Node { get; set; }
        public SKPoint Position { get; set; }
        public SKSize Size { get; set; } = new SKSize(80, 40); // 默认尺寸
    }
    public class LadderLayoutEngine
    {
        // 存储每个节点的计算位置，键使用节点的 Id
        public Dictionary<Guid, SKPoint> NodePositions { get; private set; } = new Dictionary<Guid, SKPoint>();

        // 存储连线，用于绘制 PathNode 连线
        public List<(SKPoint from, SKPoint to)> Connections { get; private set; } = new List<(SKPoint, SKPoint)>();

        // 布局参数，可根据需要调整
        private const float HorizontalSpacing = 150;
        private const float VerticalSpacing = 80;
        private const float StartX = 200;
        private const float StartY = 100;

        public void Layout(Tree tree)
        {
            NodePositions.Clear();
            Connections.Clear();

            // 每个网络（VirtualNode）独立排列，横向排版，纵向间隔根据网络内支路数量确定
            float networkX = StartX;
            foreach (var network in tree.NetRoot)
            {
                // 设定网络起始位置：以网络节点自身为基准
                SKPoint networkPos = new SKPoint(networkX, StartY);
                NodePositions[network.Id] = networkPos;

                // 对每个并联支路，排列在网络节点右侧
                for (int i = 0; i < network.Children.Count; i++)
                {
                    var child = network.Children[i];
                    float childX = networkPos.X + HorizontalSpacing;
                    float childY = networkPos.Y + i * VerticalSpacing;
                    LayoutNode(child, new SKPoint(childX, childY));
                    // 如果该子节点是通过 PathNode 连接，则记录连接线（由子节点前一个节点决定）
                    // 本示例中假设如果子节点为 PathNode，则其 From 与 To 已在数据中设置
                    if (child is PathNode path)
                    {
                        // 连线将由 path.From 与 path.To 决定，后续在绘制时依据节点位置更新
                        // 此处仅记录路径节点本身位置，后续绘制时再更新
                    }
                }
                networkX += 400; // 每个网络间隔400
            }
        }

        private void LayoutNode(INode node, SKPoint pos)
        {
            if (node == null) return;

            if (!NodePositions.ContainsKey(node.Id))
            {
                NodePositions[node.Id] = pos;
            }

            // 如果节点有 NextNode（主链），则沿水平方向排列
            //if (node.NextNode != null)
            //{
            //    SKPoint nextPos = new SKPoint(pos.X + HorizontalSpacing, pos.Y);
            //    LayoutNode(node.NextNode, nextPos);

            //    // 如果当前节点是 PathNode，则记录连接
            //    if (node.NodeType == NodeType.PathNode)
            //    {
            //        // 注意：PathNode 本身不绘制框，只绘制连线
            //        // 我们取当前节点位置与 NextNode 位置连线
            //        Connections.Add((pos, nextPos));
            //    }
            //}
        }
    }

}
